package com.czh.linklist;

/**
 * 链表的常用操作
 *
 * @author chenzhihua
 * @Date 2024/2/19
 */
public class BaseOperateLinkList {
    public static void main(String[] args) {
        // 1. 初始化链表
        ListNode node = createNode();
        ListNode insertNode = new ListNode(99);
        //2. 插入一个节点
//        insetNode(node, insertNode);
        //3. 删除一个节点
        deleteNode(node);
        //4. 遍历节点
        traverseNode(node);
        //5. 查找节点
        findNode(node, 11);
        System.out.println();
    }


    /**
     * 构建一个链表
     *
     * @return
     */
    private static ListNode createNode() {
        /* 初始化链表 1 -> 3 -> 2 -> 5 -> 4 */
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        node1.next = node3;
        node3.next = node2;
        node2.next = node5;
        node5.next = node4;
        return node1;
    }

    /**
     * 在链表的节点 n0 之后插入节点 P
     */
    private static ListNode insetNode(ListNode node, ListNode p) {
        ListNode head = null;
        // 尾插法===不存在返回值
//        while (node.next != null) {
//            node = node.next;
//        }
//        node.next = p;

        // 中插法===不存在返回值
//        while (node.next != null) {
//            if (node.val == 3) {
//                p.next = node.next;
//                node.next = p;
//                break;
//            }
//            node = node.next;
//        }
        // 前插法===存在返回值
        p.next = node;
        node = p;
        return node;
    }

    /**
     * 删除链表的节点 node 之后的首个节点
     *
     * @param node
     */
    private static void deleteNode(ListNode node) {
        if (node.next != null) {
            node.next = node.next.next;
        }
    }

    /**
     * 遍历节点
     *
     * @param node
     */
    private static void traverseNode(ListNode node) {
        while (node != null) {
            System.out.print(node.val + "->");
            node = node.next;
        }
        System.out.println();
    }

    /* 在链表中查找值为 target 的首个节点 */
    private static int findNode(ListNode node, int target) {
        int index = 0;
        while (node != null) {
            if (node.val == target) {
                System.out.printf("找到了在第 %d 个\n", index);
                return index;
            }
            index++;
            node = node.next;
        }
        System.out.println("未找到");
        return -1;
    }

}

// 定义一个列表节点
class ListNode {
    int val;
    ListNode next;

    // 构造函数
    public ListNode(int val) {
        this.val = val;
    }

    public ListNode() {
    }
}
